﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Dominio;

namespace Persistencia
{
    class BrokerNotaCredito: Broker
    {
        #region constructor

        public BrokerNotaCredito()
        {
            this.conn = ConexionBD.getInstance();
        }

        #endregion

        #region methods

        public override void add(Object o)
        {
            NotaCredito notaCreditoAux = (NotaCredito)o;
            this.conn.connect();
            string sql = "insert into Documentos(IdDocumento, Fecha, Numerador, Monto) values(" 
                + notaCreditoAux.OID + ", '" + notaCreditoAux.Fecha + "', " + notaCreditoAux.Numerador + ", '" 
                + notaCreditoAux.Monto + "')";
            this.conn.execute(sql);
            sql = "insert into NotasCredito(IdDocumento, IdCliente) values ("
                + notaCreditoAux.OID + ", " + notaCreditoAux.Cliente.OID + ")";
            this.conn.execute(sql);
            for (int i = 0; i < notaCreditoAux.Detalles.Count; i++)
            {
                Detalle detalleAux = (Detalle)notaCreditoAux.Detalles[i];
                sql = "insert into detalles(IdDocumento, IDArticulo, Cantidad, SubTotal) values("
                    + notaCreditoAux.OID + ", " + detalleAux.Articulo.OID + ", " + detalleAux.Cantidad
                    + ", '" + detalleAux.Subtotal + "')";
                this.conn.execute(sql);
            }
            this.conn.disconnect();
        }

        public override void update(Object o)
        {
            //no actualizo la tabla de NotasCredito pq no veo necesario actualizar el idCliente
            NotaCredito notaCreditoAux = (NotaCredito)o;
            string sql = "update Documentos set Fecha = '" + notaCreditoAux.Fecha
                + "', Numerador = " + notaCreditoAux.Numerador
                + ", Monto = '" + notaCreditoAux.Monto
                + "' where IdDocumento = " + notaCreditoAux.OID;
            this.conn.connect();
            this.conn.execute(sql);
            sql = "delete * from detalles where IdDocumento = " + notaCreditoAux.OID;
            this.conn.execute(sql);
            for (int i = 0; i < notaCreditoAux.Detalles.Count; i++)
            {
                Detalle detalleAux = (Detalle)notaCreditoAux.Detalles[i];
                sql = "insert into detalles(IdDocumento, IDArticulo, Cantidad, SubTotal) values("
                    + notaCreditoAux.OID + ", " + detalleAux.Articulo.OID + ", " + detalleAux.Cantidad
                    + ", '" + detalleAux.Subtotal + "')";
                this.conn.execute(sql);
            }
            this.conn.disconnect();
        }

        public override void delete(Object o)
        {
            NotaCredito notaCreditoAux = (NotaCredito)o;
            string sql = "delete * from Documentos where IdDocumento = " + notaCreditoAux.OID; 
            this.conn.connect();
            this.conn.execute(sql);
            sql = "delete * from NotasCredito where IdDocumento = " + notaCreditoAux.OID;
            this.conn.execute(sql);
            sql = "delete * from detalles where IdDocumento = " + notaCreditoAux.OID;
            this.conn.execute(sql);
            this.conn.disconnect();
        }
        
        public override void bringData(Object o)
        {
            NotaCredito notaCreditoAux = (NotaCredito)o;
            this.conn.connect();
            string sql = "Select d.*, nc.IdCliente from Documentos d, NotasCredito nc" 
                + " where d.IdDocumento = " + notaCreditoAux.OID
                + " and d.IdDocumento = nc.IdDocumento";
            this.conn.bringData(sql);
            while (this.conn.nextRecord())
            {                
                notaCreditoAux.Fecha = (DateTime)this.conn.getDataString("Fecha");
                notaCreditoAux.Numerador = int.Parse(this.conn.getDataString("Numerador").ToString());
                notaCreditoAux.Monto = double.Parse(this.conn.getDataString("Monto").ToString());
                notaCreditoAux.Cliente.OID = int.Parse(this.conn.getDataString("IdCliente").ToString());
            }
            sql = "select * from Detalles where IdDocumento = " + notaCreditoAux.OID;
            this.conn.bringList(sql);
            while (this.conn.nextRecord())
            {
                Detalle detalleAux = new Detalle();
                detalleAux.Articulo.OID = int.Parse(this.conn.getDataString("IdArticulo").ToString());
                detalleAux.Cantidad = int.Parse(this.conn.getDataString("Cantidad").ToString());
                detalleAux.Subtotal = double.Parse(this.conn.getDataString("SubTotal").ToString());
                detalleAux.OID = int.Parse(this.conn.getDataString("IdDetalle").ToString());
                notaCreditoAux.Detalles.Add(detalleAux);
            }
            this.conn.disconnect();
        }
        
        public override List<Object> bringList(Object o)
        {
            string sql = "Select d.*, nc.IdCliente from Documentos d, NotasCredito nc"
                + " where d.IdDocumento = nc.IdDocumento";
            List<Object> list = new List<Object>();
            this.conn.connect();
            this.conn.bringList(sql);
            while (this.conn.nextRecord())
            {
                NotaCredito notaCreditoAux = new NotaCredito();
                notaCreditoAux.Fecha = (DateTime)this.conn.getDataString("Fecha");
                notaCreditoAux.Numerador = int.Parse(this.conn.getDataString("Numerador").ToString());
                notaCreditoAux.Monto = double.Parse(this.conn.getDataString("Monto").ToString());
                notaCreditoAux.OID = int.Parse(this.conn.getDataString("IdDocumento").ToString());
                notaCreditoAux.Cliente.OID = int.Parse(this.conn.getDataString("IdCliente").ToString());
                list.Add(notaCreditoAux);
            }
            for (int i = 0; i < list.Count; i++)
            {
                NotaCredito notaCreditoAux = (NotaCredito)list[i];
                sql = "select * from Detalles where IdDocumento = " + notaCreditoAux.OID;
                this.conn.bringList(sql);
                while (this.conn.nextRecord())
                {
                    Detalle detalleAux = new Detalle();
                    detalleAux.Articulo.OID = int.Parse(this.conn.getDataString("IdArticulo").ToString());
                    detalleAux.Cantidad = int.Parse(this.conn.getDataString("Cantidad").ToString());
                    detalleAux.Subtotal = double.Parse(this.conn.getDataString("SubTotal").ToString());
                    detalleAux.OID = int.Parse(this.conn.getDataString("IdDetalle").ToString());
                    notaCreditoAux.Detalles.Add(detalleAux);
                }
            }
            this.conn.disconnect();
            return list;
        }

        public override int bringLastId()
        {
            int id = 0;
            this.conn.connect();
            string sql = "Select max(idDocumento) as idDocumento from Documentos";
            this.conn.bringData(sql);
            while (this.conn.nextRecord())
            {
                id = int.Parse(this.conn.getDataString("idDocumento").ToString());
            }
            this.conn.disconnect();
            return id;
        }

        #endregion        
    }
}
